#include <stdio.h>
#include <stdlib.h>
#include "single_linked_list.cpp"
// 带头结点的循环单链表 循环找出最小的结点输出并删除 直到链表为空

// 循环单链表结构体
// typedef struct LNode {
//     int data;
//     LNode *next;
// }*LinkedList, LNode;

void LoopDelMin(LinkedList &L)
{
    LNode *ptr = L->next;
    LNode *minNodePre = L;

    while (true)
    {
        // 链表为空 退出
        if (L->next == L)
            return;
        if (ptr->next == L)
        {
            // 一次遍历结束 删除最小结点
            LNode *r = minNodePre->next;
            printf("%d ", r->data);
            minNodePre->next = minNodePre->next->next;
            minNodePre = L;
            free(r);
        }
        else if (ptr->next->data < minNodePre->next->data)
            minNodePre = ptr;
        
        ptr = ptr->next;
    }
}

int main()
{
    LinkedList L;
    InitList(L);

    // 插入
    ListAppend(L, 0);
    // ListAppend(L, 3);
    // ListAppend(L, 7);
    // ListAppend(L, 10);
    LNode *ptr = L;
    while (ptr->next != NULL)
        ptr = ptr->next;
    ptr->next = L;

    LNode *p = L->next;
    printf("head->");
    while (p != L)
    {
        printf("%d->", p->data);
        p = p->next;
    }
    printf("NULL\n");

    LoopDelMin(L);

    p = L->next;
    printf("\nhead->");
    while (p != L)
    {
        printf("%d->", p->data);
        p = p->next;
    }
    printf("NULL\n");

    return 0;
}